package cn.tedu.tickets;

import java.util.HashMap;

/*需求：设计多线程编程模型，4个窗口共售票100张
* 本类通过继承Thread类的方式实现多线程售票案例**/
public class TestThread {
    public static void main(String[] args) {
        //5.创建多个线程对象
        TicketThread t1= new TicketThread();
        TicketThread t2= new TicketThread();
        TicketThread t3= new TicketThread();
        TicketThread t4= new TicketThread();
        //6.以多线程的方式启动
        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }
}
//1.创建售票业务线程类
class TicketThread extends Thread{
    //3.定义变量，用来保存票数
    //int tickets = 100;//不可以，会买400张票
    static int tickets = 100;//静态资源属于类资源，全局对象共享，只有一份
    HashMap<String,Integer> hp = new HashMap();
    //2.业务写在重写run（）里
    @Override
    public void run(){
        //4.通过循环结构来一直卖票
        while (true){
            //8.如果数据能够经受住sleep的考验，才能说明没有了安全隐患--人为制造困难
            //问题1：产生了重卖，同一张票买给了多个人
            //问题2：产生了超卖：超出了规定票数，甚至卖出了0和-1这样的票数
            try {
                Thread.sleep(10);//让程序休眠10毫秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"="+tickets--);
            String S = Thread.currentThread().getName();
            Integer a = hp.get(S);
            //做判断，如果没有票了退出死循环
            if(a == null){
                hp.put(S,1);
            }else {
                hp.put(S,a+1);
            }
            if(tickets <=0) break;
        }
        System.out.println(hp);
    }
}